package com.shujia.core

import com.shujia.core.Demo07GroupBy.StuGrp
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object Demo09ReduceByKey {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo09ReduceByKey")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    val stuLineRDD: RDD[String] = sc.textFile("spark/data/students.txt")

    // 将每条数据转换成样例类对象
    val stuRDD: RDD[StuGrp] = stuLineRDD.map(line => {
      val splits: Array[String] = line.split(",")
      StuGrp(splits(0), splits(1), splits(2).toInt, splits(3), splits(4))
    })

    /**
     * reduceByKey：也需要作用在KV格式的RDD，默认会对Key进行分组，并且需要传入一个聚合方法
     * 同时会进行预聚合操作类似combine
     */

    // 统计性别人数
    stuRDD
      .map(stu => (stu.gender, 1))
      .reduceByKey((i1: Int, i2: Int) => {
        // 指定聚合的方式：可以进行sum、max、min、count操作，不能计算平均值
        i1 + i2
      }).foreach(println)

    // 简写
    stuRDD
      .map(stu => (stu.gender, 1))
      .reduceByKey(_ + _).foreach(println)

    // 统计班级中的最大年龄
    stuRDD
      .map(stu => (stu.clazz, stu.age))
      .reduceByKey((i1: Int, i2: Int) => {
        // 指定聚合的方式：可以进行sum、max、min、count操作，不能计算平均值
        Math.max(i1, i2)
      }).foreach(println)



  }

}
